package n4_线程安全;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * public类 调用 两个类方法 判断 是否安全
 */
@Slf4j(topic = "c.T1")
public class T1_thread_unsafe {

    static final int THREAD_NUMBER = 2;
    static final int LOOP_NUMBER = 200;
    public static void main(String[] args) {
//>>>>>>>>>>>>>>>>>>>>>HEAD
//        ThreadUnsafe test = new ThreadUnsafe();
//-------------------------
        ThreadSafe test = new ThreadSafe();
//<<<<<<<<<<<<<<<<<<<<<<<<<

        // 循环遍历 产生多个线程
        for (int i = 0; i < THREAD_NUMBER; i++) {

            new Thread(() -> {
                test.method1(LOOP_NUMBER);
            }, "Thread" + i).start();
        }
    }
}
/**
 * 多个线程对[共享资源]进行读写操作 产生了 [竞态条件]  【list变量在 method1()方法外面】
 */
@Slf4j(topic = "c.ThreadUnsafe")
class ThreadUnsafe {
    // 因为上面创建了一个对象，所以多个线程 使用了共享变量list
    ArrayList<String> list = new ArrayList<>();

    public void method1(int loopNumber) {
        log.debug("--------------------");
        for (int i = 0; i < loopNumber; i++) {

            // { 临界区, 会产生竞态条件
            method2();
            method3();

            // } 临界区
        }
    }
    private void method2() {
        list.add("1");
    }
    private void method3() {
        list.remove(0);
    }
}

/**
 * 多个线程 没有 [共享资源]    【list变量在 method1()方法里面】
 */
@Slf4j(topic = "c.ThreadSafe")
class ThreadSafe {
    public void method1(int loopNumber) {
        log.debug("++++++++++++++++++++++");
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < loopNumber; i++) {

            // { 临界区, 会产生竞态条件
            method2(list);
            method3(list);

            // } 临界区
        }
    }
    private void method2(List list) {
        list.add("1");
    }
    private void method3(List list) {
        list.remove(0);
    }
}





